﻿﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Threading;
using System.Runtime.InteropServices;

namespace JYtcs
{
    class Game
    {
        Random sj = new Random();


        int i, j, x = 4, y = 4, m, n, f = 0, q, p, ti = 4, end = 0;
        string name;
        int[] x2 = new int[400];
        int[] y2 = new int[400];
        char[,] map = new char[20, 20]
    {{'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'}
    ,{'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'}
    };
        ConsoleKey k = ConsoleKey.S;
        char old = 's';


        public void gotoxy(int x, int y) //移动坐标
        {
            Console.SetCursorPosition(x, y);
        }



        public void ycgb(bool k)//隐藏光标
        {
            Console.CursorVisible = k; //隐藏光标
        }

        void bk()
        {
            Console.Write("GAME OVER");
            //	k=getchar();
            end = 1;
        }


        void len()
        {
            map[m, n] = 'O';
            x2[0] = x; y2[0] = y;
            for (i = 398; i >= 0; i--)
            {
                x2[i + 1] = x2[i];
                y2[i + 1] = y2[i];
            }
        }


        void wasd()
        {

        ui:

            //if (Console.ReadKey() ==65||Console.ReadKey() == 97)

            k = Console.ReadKey().Key;


            if (k == ConsoleKey.A)
            {

                if (old == 'd')
                {

                    k = ConsoleKey.D;
                    goto ui;
                }
                old = 'a';
                if (map[x, y - 1] == '#' || map[x, y - 1] == '*')
                    bk();
                map[x, y - 1] = map[x, y];

                y = y - 1;
            }


            if (k == ConsoleKey.W)
            {
                if (old == 's')
                {
                    k = ConsoleKey.S;
                    goto ui;
                }
                old = 'w';
                if (map[x - 1, y] == '*' || map[x - 1, y] == '#')
                    bk();
                map[x - 1, y] = map[x, y];

                x = x - 1;
            }


            if (k == ConsoleKey.D)
            {
                if (old == 'a')
                {
                    k = ConsoleKey.A;
                    goto ui;
                }

                old = 'd';
                if (map[x, y + 1] == '#' || map[x, y + 1] == '*')
                    bk();
                map[x, y + 1] = map[x, y];

                y = y + 1;
            }


            if (k == ConsoleKey.S)
            {
                if (old == 'w')
                {
                    k = ConsoleKey.W;
                    goto ui;
                }

                old = 's';
                if (map[x + 1, y] == '*' || map[x + 1, y] == '#')
                    bk();
                map[x + 1, y] = map[x, y];

                x = x + 1;
            }

            map[x2[ti], y2[ti]] = ' ';

            gotoxy(2 * y2[ti] + 1, x2[ti] + 1);
            Console.Write(" ");
        }


        void eat()
        {

            if (map[x, y] == map[q, p])

            {

                q = sj.Next(1, 20);
                p = sj.Next(1, 20);
                ++ti;
            newdan:
                for (i = 0; i < ti; i++)
                {

                    if (x2[i] == q && y2[i] == p)
                    {

                        q = sj.Next(1, 20);
                        p = sj.Next(1, 20);

                        goto newdan;

                    }
                }



                map[q, p] = 'O';
                m = q; n = p;


                f = f + 1;
            }

            if (map[x, y] == map[m, n])
                map[x, y] = '*';
        }



        void show()
        {

            map[x, y] = '*';

            gotoxy(2 * n + 1, m + 1);

            Console.WriteLine("■");




            gotoxy(2 * y + 1, x + 1);
            if (map[x, y] == '*')
                Console.WriteLine("■");


            gotoxy(50, 10);
            Console.WriteLine("亲爱的" + name + "你的分数为:" + f);

            Thread.Sleep(200);
        }

        void start()
        {
            q = sj.Next(1, 20);
            p = sj.Next(1, 20);

            Console.Write("\n欢迎来到贪吃蛇的世界！\n请输入你的玩家名：");
            name = Console.ReadLine();

            Console.Clear();


            gotoxy(1, 1);
            for (i = 0; i < 20; i++)
            {
                Console.WriteLine();
                for (j = 0; j < 20; j++)


                {
                    if (map[i, j] == '#')
                    {
                        gotoxy(2 * j + 1, i + 1);
                        Console.Write("■");
                    }
                }
            }
        }

        static void Main1(string[] args)
        {
            Game b = new Game();
            b.start();

            for (; ; )
            {

                b.len();

                b.wasd();

                if (b.end == 1)
                    break;
                b.eat();


                b.show();

                if (b.ti == 300)
                {
                    Console.Clear();
                    Console.WriteLine("you are winner");
                }
            }
            Console.Clear();
            Console.WriteLine("游戏结束");





        }

    }

}

